package com.learn.dubbo.core.redis.Interface;

import java.util.List;

import redis.clients.jedis.BinaryClient.LIST_POSITION;

public interface JedisList extends JedisBaseInterface {

	/**
     * List长度
     * @param String key
     * @return 长度
     * */
    public long llen(String key) ;

    /**
     * 覆盖操作,将覆盖List中指定位置的值
     * @param key
     * @param int index 位置
     * @param String  value 值
     * @return 状态码
     * */
    public String lset(String key, int index, String value) ;

    /**
     * 在value的相对位置插入记录
     * @param key
     * @param LIST_POSITION   前面插入或后面插入
     * @param String pivot 相对位置的内容
     * @param String value 插入的内容
     * @return 记录总数
     * */
    public long linsert(String key, LIST_POSITION where, String pivot,String value) ;

    /**
     * 获取List中指定位置的值
     * @param String  key
     * @param int index 位置
     * @return 值
     * **/
    public String lindex(String key, int index) ;

    /**
     * 将List中的第一条记录移出List
     * @param String key
     * @return 移出的记录
     * */
    public String lpop(String key) ;
    
    /**
     * 将List中的第一条记录移出List，如果timeout为等待超时时间，如果timeout为0则一直等待下去,应用场景：长轮询,队列
     * @param String key
     * @return 移出的记录
     * */
    public List<String> blpop(int timeout,String key) ;
    
    

    /**
     * 将List中最后第一条记录移出List
     *
     * @param byte[] key
     * @return 移出的记录
     * */
    public String rpop(String key) ;
    
    /**
     * 将List中最后第一条记录移出List，如果timeout为等待超时时间，如果timeout为0则一直等待下去,应用场景：长轮询,队列
     *
     * @param byte[] key
     * @return 移出的记录
     * */
    public List<String> brpop(int timeout,String key) ;

    /**
     * 向List尾部追加记录
     * @param String key
     * @param String value
     * @return 记录总数
     * */
    public long lpush(String key, String value) ;

    /**
     * 向List头部追加记录
     * @param String  key
     * @param String  value
     * @return 记录总数
     * */
    public long rpush(String key, String value) ;

    /**
     * 获取指定范围的记录，可以做为分页使用
     * @param String key
     * @param long start
     * @param long end
     * @return List
     * */
    public List<String> lrange(String key, long start, long end) ;

    /**
     * 删除List中c条记录，被删除的记录值为value
     * @param String key
     * @param int c 要删除的数量，如果为负数则从List的尾部检查并删除符合的记录
     * @param String value 要匹配的值
     * @return 删除后的List中的记录数
     * */
    public long lrem(String key, int c, String value) ;

    /**
     * 算是删除吧，只保留start与end之间的记录
     * @param String key
     * @param int start 记录的开始位置(0表示第一条记录)
     * @param int end 记录的结束位置（如果为-1则表示最后一个，-2，-3以此类推）
     * @return 执行状态码
     * */
    public String ltrim(String key, int start, int end) ;


}
